package zz.note.satoken.controller;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaTokenConsts;
import common.utils.ResultModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import zz.note.satoken.entity.SaUserEntity;
import zz.note.satoken.form.SaUserForm;
import zz.note.satoken.service.SaUserService;

import java.util.HashMap;
import java.util.Map;

/**
 * 登录服务
 * @Author: ZZ
 * @date 2022/2/14
 */
@RestController
@Slf4j
@RequestMapping("/login")
public class LoginController {
	@Autowired
	private SaUserService saUserService;

	/**
	 * 资源页浏览器访问测试： http://localhost:8081
	 * @return
	 */
	@RequestMapping("/index")
	public String index() {
		String str = "<br />"
				+ "<h1 style='text-align: center;'>资源页 （登录后才可进入本页面） </h1>"
				+ "<hr/>"
				+ "<p style='text-align: center;'> Sa-Token " + SaTokenConsts.VERSION_NO + " </p>";
		return str;
	}

	// 登录
	@RequestMapping("doLogin")
	public ResultModel doLogin(@RequestBody SaUserForm saUserForm) {
		// 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对
		SaUserEntity user = saUserService.lambdaQuery()
				.eq(SaUserEntity::getUserName,saUserForm.getUserName())
				.eq(SaUserEntity::getUserPass,saUserForm.getUserPass())
				.one();
		if (user != null){
			StpUtil.login(user.getUserId());
			return ResultModel.ok("登录成功！");
		}

		return ResultModel.ok("登录失败！");
	}

	// 查询当前会话登录状态
	@RequestMapping("isLogin")
	public String isLogin() {
		return "当前会话是否登录：" + StpUtil.isLogin();
	}

	// 校验当前会话登录状态，未登录抛异常  cn.dev33.satoken.exception.NotLoginException
	@RequestMapping("checkLogin")
	public ResultModel checkLogin() {
		StpUtil.checkLogin();
		return ResultModel.ok("已经登陆");
	}

	// 当前会话登出
	@RequestMapping("logout")
	public ResultModel logout() {
		StpUtil.logout();
		return ResultModel.ok("已登出");
	}

	/**
	 * 获取当前会话的一些信息
	 * @return
	 */
	@GetMapping("getSessionMessage")
	public ResultModel getSessionMessage() {
		Map<String,Object> result = new HashMap<>();
		// 获取当前会话账号id, 如果未登录，则抛出异常：`NotLoginException`
		log.info("当前会话账号id:{}",StpUtil.getLoginId());
		result.put("getLoginId",StpUtil.getLoginId());
		// 类似查询API还有：
//		StpUtil.getLoginIdAsString();    // 获取当前会话账号id, 并转化为`String`类型
//		StpUtil.getLoginIdAsInt();       // 获取当前会话账号id, 并转化为`int`类型
//		StpUtil.getLoginIdAsLong();      // 获取当前会话账号id, 并转化为`long`类型

		// ---------- 指定未登录情形下返回的默认值 ----------

		// 获取当前会话账号id, 如果未登录，则返回null
		log.info("当前会话账号id,未登录返回null:{}",StpUtil.getLoginIdDefaultNull());
		result.put("getLoginIdDefaultNull",StpUtil.getLoginIdDefaultNull());
		// 获取当前会话账号id, 如果未登录，则返回默认值 （`defaultValue`可以为任意类型）
		log.info("获取当前会话账号id, 如果未登录，则返回默认值zz's Token:{}",StpUtil.getLoginId("zz's Token"));
		result.put("getLoginId(T default)",StpUtil.getLoginId("zz's Token"));
		return ResultModel.ok().put("data",result);
	}


}
